package com.tedu.API.IO;

import org.junit.Test;

import java.io.*;

/**
 * IO流--传对象--高级流
 * ObjectOutputStream  对象输出流----写操作
 * ObjectInputStream 对象输入流------读操作
 */
public class ObjectIO {
    /**
     * ObjectOutputStream 对象输出流
     * 使用方式：1.创建实现序列化接口的对象
     *          2.对象输出流----xxx.obj文件
     *                传输对象，指定格式obj
     *
     */
    @Test
    public void testOOS() {
        //1.创建persion对象
        Persion p=new Persion();
        p.setName("韩美娟");
        //数组
        // String[] str={1,1,1,1,1} 静态数组
        //String[] str=new String[]{};
        p.setSay(new String[]{"百因必有果，你的报应就是桃子~~~"});
        System.out.println(""+p);

        //对象输出写出文件 xxx.obj
        FileOutputStream fos=null;
        ObjectOutputStream oos=null;
        try {
            fos=new FileOutputStream("persion.obj");
            oos=new ObjectOutputStream(fos);
            /**
             * writeObject(Object obj) -----理解：写出对象
             * 该方法会将给定的对象按照其结构进行转换
             * 转换为一组“组”字节，在通过其处理流进行写出
             * 写出文件术语：
             * 1.通过对象输出流将Persion类，先转换为一组“组”字节，这个过程【对象的序列化】
             * 2.将序列化后的字节在通过字节流【低级流】写入文件当中【硬盘上】做长久保存，这个
             *   过程【数据持久化】 将persion.obj持久保存硬盘上
             *   Not 没有序列化异常
             *   原因：写出类没有实例化接口
             */
            oos.writeObject(p);
            System.out.println("写出成功~~");
        }catch (FileNotFoundException e){
            e.printStackTrace();
        }
        catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (oos!=null)
                try {
                    oos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }
    }

    /**
     * ObjectInputStream 对象输入流
     *  序列化：将对象转换为二进制
     *  反序列化 将二进制转换为对象
     *  readObject()返回读取的对象【?】
     *  需求：将序列化persion.obj文件按照对象的方法读入【反序列化】
     */
    @Test
    public void testOIS(){
        FileInputStream fis=null;
        ObjectInputStream ois=null;
        try {
            fis=new FileInputStream("persion.obj");
            ois=new ObjectInputStream(fis);
            //readObject() 获取对象【反序列化操作：二进制转成对象】
            System.out.println(""+ois.readObject());
            System.out.println("反序列成功");
        }catch (FileNotFoundException e){
            e.printStackTrace();
        }
        catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (ois!=null)
                try {
                    ois.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }
    }
}
